package gerror

import (
	"fmt"
)

/*
 * Defined 预定义方法 可以在项目中预定义一组常用的错误信息
 * -------------------------------
 * 错误码通常设计为6位，前3位为模块标识或HTTP状态码，后3位为自定义错误码
 * 自定义请求/响应类错误码:
 * -------------------------------
 * 请求类错误   400XXX => HTTP 400  (自定义范围: 400001 ~ 400999)
 * 认证类错误   401XXX => HTTP 401  (自定义范围: 401001 ~ 401999)
 * 拒绝类错误   403XXX => HTTP 403、404  (自定义范围: 403001 ~ 404999)
 * 服务类错误   500XXX => HTTP 500  (自定义范围: 500001 ~ 500999)
 * -------------------------------
 * 自定义业务类错误码:
 * 前3位为模块标识，后3位为自定义错误码
 * 自定义错误   600XXX => HTTP 400/500  (自定义范围: 600001 ~ 999999)
 */
// Defined 预定义一个 Error 错误
//   - msg 错误信息
//   - 注意: 预定义错误没有堆栈信息，如需堆栈信息，程序返回预定义错误时请调用 <GerrorObj>.WithStack(true)
//
//go:noinline
func Defined(msg string) IError {
	return newGerror(defaultErrCode, msg, nil, false, true)
}

// DefinedCode 预定义一个 Error 错误
//   - code 错误码
//   - msg 错误信息
//   - 注意: 预定义错误没有堆栈信息，如需堆栈信息，程序返回预定义错误时请调用 <GerrorObj>.WithStack(true)
//
//go:noinline
func DefinedCode(code int, msg string) IError {
	return newGerror(code, msg, nil, false, true)
}

// DefinedF 预定义一个 Error 错误, like fmt.Errorf
//   - msg 错误信息
//   - 注意: 预定义错误没有堆栈信息，如需堆栈信息，程序返回预定义错误时请调用 <GerrorObj>.WithStack(true)
//
//go:noinline
func DefinedF(format string, a ...any) IError {
	return newGerror(defaultErrCode, fmt.Sprintf(format, a...), nil, false, true)
}

// DefinedCodeF 预定义一个格式化的 Error 错误, like fmt.Errorf
//   - code 错误码
//   - msg 错误信息
//   - 注意: 预定义错误没有堆栈信息，如需堆栈信息，程序返回预定义错误时请调用 <GerrorObj>.WithStack(true)
//
//go:noinline
func DefinedCodeF(code int, format string, a ...any) IError {
	return newGerror(code, fmt.Sprintf(format, a...), nil, false, true)
}
